<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <meta name="renderer" content="webkit">
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    <meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=0">
</head>
<body>
    <script >
        /*
        async 和 await

        两种语法结合可以让异步代码像同步代码一样

        async 和 await 两种语法结合让异步代码像是同步代码一样

        await 表达式

        - await 必须写在 async 函数中
        - awiat 右侧的表达式一般为Promise对象
        - awiat 返回的是Promoise 成功的值
        - await 的promise失败了，就会抛出异常，需要通过try..catch捕获处理
        */

        async function fn(){

            return "123";


            /*
             由 async 声明的对象，返回一定是一个Promise对象

             如果没有返回值，则是一个成功的Promise对象
             如果返回值不是一个Promise对象，则是一个成功的Promise对象
             如果抛出异常，，则返回结果是一个失败的Promise
             如果返回的是一个Promise对象，则根据Promise的内容返回
            */
        }

        const p = new Promise((resolve,reject)=>{
            resolve("123")
        })

        async function fn1(){
            let result = await p;
            console.log(result);// 用户数据
            try{
                let resul1 = await p;
            }catch(e){
                console.log(e);
            }
        }

        /* 对象方法的扩展
        
        Object.values 和 Object.entries

        - Object.values 方法返回一个给定对象的所有可枚举的属性值的数组
        - Object.entries 方法返回一个给定对象自身可比遍历属性[key,value]的数组

        */

        const arr = {
            name:"ss",
            cities:['beijing','shanghai'],
            xueke:['qianduan','java']
        }

        // 获取对象所有的键
        console.log(Object.keys(arr));
        // 值
        console.log(Object.values(arr));
        // 键值关系的对象
        console.log(Object.entries(arr));

        // 方便创建map
        const m = new Map(Object.entries(arr));

        m.get('cities')

        // 对象属性的描述对象
        Object.getOwnPropertyDescriptor(arr);

        const obj1 = Object.create(null,{
            name:{
                value:'123',
                writable:true,
                configurable:true,
                enumerable:true
            }
        });
        // 方便深度克隆

    </script>
</body>

</html>